# _*_ encoding:utf-8 _*_
from multiprocessing import set_start_method
# 导入进程、队列和管道
from multiprocessing import Process, Queue, Pipe

# 注意Queue和queue.Queue并不是同一个对象
detect_queue = Queue()
detect_queue.put(1)
print(detect_queue.get())


def f(q1):
    print('start')
    # 等待主进程传入一个值
    print(q1.get())
    print('end')


# Pipe会创建双向的管道
c1, c2 = Pipe()
# 向管道的c1端传入数据，在c2端读取出来
c1.send('abc')
print(c2.recv())
# c2端写入的，从c1端读取出来
c2.send('xyz')
print(c1.recv())


def f2(c):
    # 从连接中读取数据，然后乘2再写回去
    c.send(c.recv() * 2)


if __name__ == '__main__':
    '''
    set_start_method为创建进程的方式：
        fork为分支创建，spawn为分产创建。
    '''
    set_start_method('fork', True)
    # ------------------------------
    q2 = Queue()
    # 启动一个子进程直接运行
    Process(target=f, args=(q2,)).start()
    # 子进程阻塞到get，等待传入一个值
    q2.put(100)
    # ------------------------------
    c3, c4 = Pipe()
    # 子进程会等待向管道写
    Process(target=f2, args=(c4,)).start()
    # 从c3端写入数据，然后函数回返回回来，再在c3端读取
    c3.send(55)
    print(c3.recv())